package com.hhf.spring.bean;

import org.springframework.beans.BeansException;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Lookup;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware;
import org.springframework.context.MessageSource;
import org.springframework.context.MessageSourceAware;
import org.springframework.stereotype.Component;


/**
 * Aware接口：装配spring底层的一些组件（也就是bean工厂里面的东西）
 */
//@Component
public class Person implements ApplicationContextAware, MessageSourceAware {

//	@Autowired
	ApplicationContext context ;  //可以要到ioc容器

	MessageSource messageSource;

	public ApplicationContext getContext() {
		return context;
	}

	public Person() {
		System.out.println("person创建....");
	}

	private String name;

	//把这个cat自动从容器中拿到
	//单实例里面依赖多实例的时候，就不能@Autowired自动装配
	private Cat cat;

	@Autowired
	public void setCat(Cat cat) {
		this.cat = cat;
	}

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

	//去容器中找，但是容器中的这个组件，是一个多实例的，所以一旦去了容器中找，
	// 容器一看这个组件是多实例的，容器就应该给cat再创建一个实例
	//@Lookup一定要放在get的方法上，因为@Bean的方式注册到容器中，那么@Lookup这个注解就不能用的
	@Lookup
	public Cat getCat() {
		return cat;
	}

	@Override
	public String toString() {
		return "Person{" +
				"name='" + name + '\'' +
				'}';
	}

	@Override
	public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
		//利用回调机制，把ioc容器传进来
		this.context = applicationContext;
	}

	@Override
	public void setMessageSource(MessageSource messageSource) {
		this.messageSource = messageSource;
	}
}
